class websocketUtil {
	constructor(url, time, params) {
		this.is_open_socket = false //避免重复连接
		this.url = url //地址
		this.data = params // 需要传的数据
		//心跳检测
		this.timeout = time //多少秒执行检测
		this.heartbeatInterval = null //检测服务器端是否还活着，心跳定时器
		this.reconnectTimeOut = null //重连之后多久再次重连，重连定时器
		this.socketTask = null // websocket
		this.closeState = true
		try {
			return this.connectSocketInit() // 创建websocket连接
		} catch (e) {
			this.is_open_socket = false
			this.reconnect(); // 重新连接
		}
	}

	// 创建websocket连接
	connectSocketInit() {
		this.socketTask = uni.connectSocket({
			url: this.url,
			success: () => {
				// console.log("正准备建立websocket中...");
				// 返回实例
				return this.socketTask
			},
		});
		this.socketTask.onOpen(res => {
			// console.log("WebSocket连接正常！", res);
			clearTimeout(this.reconnectTimeOut)
			clearTimeout(this.heartbeatInterval)
			this.is_open_socket = true;
			this.start();
			// 注：只有连接正常打开中 ，才能正常收到消息
			this.socketTask.onMessage((res) => {
				// console.log(res.data)
			});
		})
		// 这里仅是事件监听【如果socket关闭了会执行】
		this.socketTask.onClose(() => {
			// console.log("已经被关闭了")
			if (this.closeState) {
				this.is_open_socket = false;
				this.reconnect();
			}
		})
	}

	//开启心跳检测
	start() {
		this.heartbeatInterval = setInterval(() => {
			this.send(this.data);
		}, this.timeout)
	}

	//发送消息
	send(value) {
		// await new Promise((resolve) => {
		// 	setTimeout(() => {
		// 		resolve();
		// 	}, 1000);
		// });
		// 注：只有连接正常打开中，才能正常成功发送消息
		let that = this
		this.socketTask.send({
			data: value,
			async success() {
				// console.log("消息发送成功", value);zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
			},
			async fail() {
				that.reconnect(); //重新连接
			},
		});
	}


	//重新连接
	reconnect() {
		//停止发送心跳
		clearInterval(this.heartbeatInterval)
		//如果不是人为关闭的话，进行重连
		if (!this.is_open_socket) {
			this.reconnectTimeOut = setTimeout(() => {
				this.connectSocketInit(); // 创建websocket连接 
			}, 3000)
		}
	}
	//外部获取消息
	getMessage(callback) {
		this.socketTask.onMessage((res) => {
			return callback(res)
		})
	}
	// 关闭websoket
	closeWebsocket() {
		this.is_open_socket = true // 正常关闭状态
		clearInterval(this.heartbeatInterval) // 关闭心跳定时器
		clearTimeout(this.reconnectTimeOut) // 关闭重连定时器
		this.socketTask.close() // 关闭websocket
		this.closeState = false
	}

}

module.exports = websocketUtil